package cn.tedu.csmall.product.schedule;

import cn.tedu.csmall.product.cache.AlbumCacheRepository;
import cn.tedu.csmall.product.mapper.AlbumMapper;
import cn.tedu.csmall.product.pojo.entity.Album;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

@Component
@Slf4j
public class CacheSchedule {

    @Autowired
    AlbumCacheRepository repository;
    @Autowired
    AlbumMapper mapper;
    @Autowired
    RedisTemplate<String, Serializable> redisTemplate;

    // fixedRate: 执行频率，从【上一次执行开始时的时间】来计算下一次的执行时间。以毫秒为单位
    // fixedDelay: 执行间隔，从【上一次执行结束时的时间】来计算下一次的执行时间。以毫秒为单位
    // cron: 取值是一个字符串，从左至右分别是：秒 分 时 日 月 周 [年]
    // --各值均可使用通配符
    // --使用（*）表示任意值
    // --使用（?）表示不关心此值，此通配符仅可用于“日”和“周”
    // ----------------秒分时 日月周
    @Scheduled(cron = "0 0 0 1 * ?")
    //@Scheduled(fixedRate = 5000)
    public void albumSqlToRedis() {

        log.debug("CacheSchedule.albumSqlToRedis()");
        // 删除【album:item:*】模式的所有key
        String pattern = repository.ITEM_KEY_PREFIX;
        Set<String> keys = redisTemplate.keys(pattern + "*");
        redisTemplate.delete(keys);

        // 重新将数据库中的数据写入redis
        QueryWrapper<Album> queryWrapper = new QueryWrapper();
        List<Album> albumList = mapper.selectList(queryWrapper);
        for (Album album : albumList) {
            repository.save(mapper.getStandardById(album.getId()));
        }


    }
}
